import logging

import pandas as pd
from pandas import Series
from pandas.core.interchange.dataframe_protocol import DataFrame
from Basic import Basic
from tools.datetime_tools import convert_mmdd_to_date

logging.basicConfig(
    level=logging.DEBUG,
    format='%(levelname)8s: %(message)s'
)

# 设置输出对齐方式
pd.set_option('display.unicode.ambiguous_as_wide', True)  # 把模糊字符视为宽字符
pd.set_option('display.unicode.east_asian_width', True)  # 把东亚字符视为宽字符
pd.set_option('display.width', 180)  # 设置打印宽度，根据需要调整

文档 = '([^-\.]+)'
班级 = '([^-\.]+)'
学号 = '([0-9]{11})'
姓名 = '([^-\.]+)'
日期 = '([0-9]{4})'
后缀 = '([^-\.]+)'

BASE_PATH = r"D:\100-Project\2025-2026-1学期安排\首义学院\19201018_《软件工程综合实践（创新创业）（企业）》"
FOLDER_PATH = f"{BASE_PATH}\学生提交\实习报告"
FILE_TYPES = ['.doc', '.docx']
PATTERN_报告 = f'^{文档}-{班级}-{学号}-{姓名}.{日期}.{后缀}$'
OUTPUT_FILE = f"{BASE_PATH}\学生提交\输出\报告结果.xlsx"
STU_NAME_LIST_FILE = f"{BASE_PATH}\学生提交\学生名单.xlsx"


class 实践报告(Basic):
    # 类属性（所有实例共享）
    __BASE_SCORE = 44

    def __init__(self):
        super().__init__()

        # self.name_sheet_file_path = f"{BASE_PATH}\学生提交\学生名单.xlsx"
        # self.folder_path = f"{BASE_PATH}\学生提交\实习报告"
        # self.output_file = f"{BASE_PATH}\学生提交\输出\报告结果.xlsx"

        self.filenames: Series = pd.Series(dtype=str)
        self.ids = pd.Series(dtype=int)
        self.names = pd.Series(dtype=str)

        self.stu_list: DataFrame = pd.DataFrame(columns=['学号', '姓名'])
        self.commited_list: DataFrame = pd.DataFrame(columns=['学号', '姓名', '日期', '实践表现'])
        self.all_list: DataFrame = pd.DataFrame(columns=['学号', '姓名', '日期', '实践表现'])

    def get_filenames(self):
        se_filenames = self.get_filenames_in_folder(FOLDER_PATH, FILE_TYPES)

        self.check_filenames_format(se_filenames, PATTERN_报告)
        self.check_filenames_duplicates(se_filenames)

        return se_filenames

    def get_commited_list(self) -> DataFrame:
        logging.debug("统计已提交的学生记录")

        if not self.commited_list.empty:
            return self.commited_list

        se_filenames = self.get_filenames()

        se_学号 = self.extract_parts_from_filename(se_filenames, PATTERN_报告, 3).astype(int)
        se_姓名 = self.extract_parts_from_filename(se_filenames, PATTERN_报告, 4).astype(str)
        se_日期 = self.extract_parts_from_filename(se_filenames, PATTERN_报告, 5).astype(str)

        # region 实践表现（满分30分）
        se_date = convert_mmdd_to_date(se_日期)

        min_date = se_date.min()  # 1. 找到最早日期
        days_diff = (se_date - min_date).dt.days  # 2. 计算每个日期与最早日期的天数差
        se_成绩 = self.__BASE_SCORE - (days_diff + 1) // 2
        # endregion

        # region 设计报告（满分50分）
        # endregion

        df_merged = pd.DataFrame({
            '学号': se_学号,
            '姓名': se_姓名,
            '日期': se_日期,
            '实践表现': se_成绩
        })
        self.commited_list = df_merged

        return self.commited_list

    def get_all_list(self) -> DataFrame:
        logging.debug("统计所有学生记录")
        if not self.all_list.empty:
            return self.all_list

        df_stu_list = self.get_stu_list_from(STU_NAME_LIST_FILE)
        df_commited_list = self.get_commited_list()
        df_commited_list = df_commited_list[['学号', '日期', '实践表现']]

        merged_df = pd.merge(
            df_stu_list,  # 左表
            df_commited_list,  # 右表
            on='学号',  # 关联列（必须在两表中都存在）
            how='left',  # 左连接方式
            suffixes=('_left', '_right')  # 解决同名列冲突（如 bbb 在两表都存在）
        )

        self.all_list = merged_df
        return self.all_list


if __name__ == "__main__":
    # df_学生_信息 = get_学生_信息()

    报告 = 实践报告()
    # se = 报告.get_commited_list()
    # print(se)

    df = 报告.get_all_list()
    print(df[df['姓名']=='赵修阳'])

    # min = df['实践表现'].min()
    # df['实践表现'] = df['实践表现'].fillna(min-1)
    # print(df)

    # df.to_excel(OUTPUT_FILE, index=False)
    # print(f"✅ 数据合并完成! 文件已保存至: {OUTPUT_FILE}")
    # print(df)
